Abstract Class
An abstract class is a class intended to serve as a base abstraction and cannot normally be instantiated directly. It can contain both implemented methods and abstract methods that derived classes must implement. I use an abstract class when related types share common state, invariants, or implementation, while still requiring subclasses to provide specific behavior. It is particularly useful when there is a genuine IS-A relationship and some common behavior belongs in the base class.
Cannot normally be instantiated directly.
Can contain abstract and concrete methods.
Can contain instance state and constructors.
Useful for sharing common implementation among closely related types.
Should represent a meaningful abstraction rather than being used merely for code reuse.